home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / expr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-10-10  |  1.8 KB  |  110 lines

  1. /* EXPR.C Dr Dobbs Sept 1985 pp 25. */
  2.  
  3. #include <stdio.h>
  4. #include <ctype.h>
  5.  
  6. static char *str;
  7. static int error;
  8.  
  9.  
  10. main(argc, argv)
  11. char **argv;
  12.     {
  13.     char buf[133], *bp = buf;
  14.     int err, rval;
  15.     
  16.     if (argc > 2)
  17.     {
  18.     fprintf(stderr,"usage: expr [<expression>]");
  19.     exit(-1);
  20.     }
  21.     if (argc > 1)
  22.     {
  23.     rval=parse(argv[1], &err);
  24.     printf(err ? "*** ERROR ***" : "%d", rval);
  25.     exit(rval);
  26.     }
  27.     printf("Enter expression or <cr> to exit program\n");
  28.     
  29.     while(1)
  30.     {
  31.     printf("? ");
  32.     if (gets(buf) == NULL || !*buf)
  33.         exit(0);
  34.     rval=parse(buf, &err);
  35.     
  36.     if (err)
  37.         printf("*** ERROR ***\n");
  38.     else
  39.         printf("%s = %d\n", buf, rval);
  40.     }
  41.     }
  42.  
  43. int parse(expression, err)
  44. char *expression;
  45. int *err;
  46. {
  47.     register int rval;
  48.     
  49.     error=0;
  50.     str=expression;
  51.     rval=expr();
  52.     return((*err = error) ? 0 : rval);
  53. }
  54.  
  55. static int expr()
  56. {
  57.     int lval;
  58.     
  59.     lval=factor();
  60.     switch (*str)
  61.     {
  62.     case '+' : str++; lval += expr(); break;
  63.     case '-' : str++; lval -= expr(); break;
  64.     case '*' : str++; lval *= expr(); break;
  65.     case '/' : str++; lval /= expr(); break;
  66.     default :
  67.     }
  68.     return(lval);
  69. }
  70.  
  71. static int factor()
  72. {
  73.     int rval = 0 , sign = 1 ;
  74.     
  75.     if (*str == '-')
  76.     {
  77.     sign = -1;
  78.     str++;
  79.     }
  80.     if (*str != '(' )
  81.     rval=constant();
  82.     else
  83.     {
  84.     str++;
  85.     rval=expr();
  86.     if (*str == ')' )
  87.         str++;
  88.     else
  89.     {
  90.         printf("mismatched parens\n");
  91.         error++;
  92.     }
  93.     }
  94.     return(rval * sign);
  95. }
  96.  
  97. static int constant()
  98. {
  99.     int rval = 0;
  100.     
  101.     if (!isdigit(*str))
  102.     error++;
  103.     while ( *str && isdigit(*str) )
  104.     {
  105.     rval=(rval*10) + (*str - '0');
  106.     str++;
  107.     }
  108.     return(rval);
  109. }
  110.